package cn.rcth.base.exception;

import javax.swing.*;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.KeyEvent;
import java.io.IOException;

/**
 * 使用 Robot 操作键盘实现 消息轰炸(qq,微信)
 */
public class QQBoom {


    public static void main(String[] args) throws AWTException, InterruptedException {
        Robot robot = new Robot();
        int i = 0;

        while(i<30)
        {
            robot.mouseMove(100+(i*100), 200+(i*100));
            robot.mouseWheel(20);
            i++;
            Thread.sleep(100l);
        }


        // diaoYong("从前有座山,山上有座庙,庙里有个老和尚,老和尚对小和尚说:" , 5);
        //imgDiao( "C:\\Users\\Administrator\\Desktop\\biaoqing.jpg");
        //testXiao(5);
    }


    public static void testXiao(int frequency) throws AWTException {

        Robot robot = new Robot();
        // 创建Robot对象
        robot.delay(5000);// 延迟三秒，主要是为了预留出打开窗口的时间，括号内的单位为毫秒
        for (int j = 0; j < frequency; j++) {//循环次数
            // 以下两行按下了ctrl+v，完成粘贴功能
            robot.keyPress(KeyEvent.VK_1);
            robot.keyPress(KeyEvent.VK_Q);
            robot.keyPress(KeyEvent.VK_W);
            robot.keyPress(KeyEvent.VK_S);
            robot.keyPress(KeyEvent.VK_D);
            robot.keyPress(KeyEvent.VK_G);
            robot.keyPress(KeyEvent.VK_J);
            robot.keyPress(KeyEvent.VK_O);
            robot.keyPress(KeyEvent.VK_J);
            robot.keyPress(KeyEvent.VK_O);
            robot.keyRelease(KeyEvent.VK_CONTROL);// 释放ctrl按键，像ctrl，退格键，删除键这样的功能性按键，在按下后一定要释放，不然会出问题。crtl如果按住没有释放，在按其他字母按键是，敲出来的回事ctrl的快捷键。
            robot.delay(1000);// 延迟一秒再发送，不然会一次性全发布出去，因为电脑的处理速度很快，每次粘贴发送的速度几乎是一瞬间，所以给人的感觉就是一次性发送了全部。这个时间可以自己改，想几秒发送一条都可以
            robot.keyPress(KeyEvent.VK_ENTER);// 回车
            // }
        }


    }

    /**
     * 图片
     * @param img 图片路径
     */
    public static void imgDiao(String img) throws AWTException {

        Robot robot = new Robot();
        // 创建Robot对象
        robot.delay(5000);// 延迟三秒，主要是为了预留出打开窗口的时间，括号内的单位为毫秒
        Image image = new ImageIcon(img).getImage();//这里是获取图片，图片路径自己确定
        setClipboardImage(image);
        for (int j = 0; j < 1; j++) {//循环次数
            // 以下两行按下了ctrl+v，完成粘贴功能
            robot.keyPress(KeyEvent.VK_CONTROL);
            robot.keyPress(KeyEvent.VK_V);

            robot.keyRelease(KeyEvent.VK_CONTROL);// 释放ctrl按键，像ctrl，退格键，删除键这样的功能性按键，在按下后一定要释放，不然会出问题。crtl如果按住没有释放，在按其他字母按键是，敲出来的回事ctrl的快捷键。
            robot.delay(1000);// 延迟一秒再发送，不然会一次性全发布出去，因为电脑的处理速度很快，每次粘贴发送的速度几乎是一瞬间，所以给人的感觉就是一次性发送了全部。这个时间可以自己改，想几秒发送一条都可以
            robot.keyPress(KeyEvent.VK_ENTER);// 回车
            // }
        }
    }


    /**
     * 消息
     *
     * @param sentence  内容
     * @param frequency 次数
     */
    public static void diaoYong(String sentence, int frequency) throws AWTException {

        Robot robot = new Robot();// 创建Robot对象

        robot.delay(5000);// 延迟五秒，主要是为了预留出打开窗口的时间，括号内的单位为毫秒
        Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard();
        String[] authors = sentence.split("[,]");// 字符串根据,分割
        for (int j = 1; j < frequency + 1; j++) {//循环次数
            for (int i = 0; i < authors.length; i++) {
                String sentencet = authors[i];
                //Transferable tText = new StringSelection(sentencet +"  第: "+j  + "次" );
                Transferable tText = new StringSelection(sentencet);
                clip.setContents(tText, null);
                // for (int j = 1; j <= 1; j++) {
                // 以下两行按下了ctrl+v，完成粘贴功能
                robot.keyPress(KeyEvent.VK_CONTROL);
                robot.keyPress(KeyEvent.VK_V);

                // 释放ctrl按键，像ctrl，退格键，删除键这样的功能性按键，在按下后一定要释放，不然会出问题。crtl如果按住没有释放，在按其他字母按键是，敲出来的回事ctrl的快捷键。
                robot.keyRelease(KeyEvent.VK_CONTROL);
                // 延迟一秒再发送，不然会一次性全发布出去，因为电脑的处理速度很快，每次粘贴发送的速度几乎是一瞬间，所以给人的感觉就是一次性发送了全部。这个时间可以自己改，想几秒发送一条都可以
                robot.delay(1000);
                // 回车
                robot.keyPress(KeyEvent.VK_ENTER);

            }
        }

    }


    public static void setClipboardImage(final Image image) {
        Transferable trans = new Transferable() {
            public DataFlavor[] getTransferDataFlavors() {
                return new DataFlavor[]{DataFlavor.imageFlavor};
            }

            public boolean isDataFlavorSupported(DataFlavor flavor) {
                return DataFlavor.imageFlavor.equals(flavor);
            }

            public Object getTransferData(DataFlavor flavor)
                    throws UnsupportedFlavorException, IOException {
                if (isDataFlavorSupported(flavor))
                    return image;
                throw new UnsupportedFlavorException(flavor);
            }

        };
        Toolkit.getDefaultToolkit().getSystemClipboard().setContents(trans,
                null);
    }

}
